﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include <stdio.h>
//#include <stdlib.h>
//#include <assert.h>
//#include <stdbool.h>
//
//typedef int QueueDataType;
//
//typedef struct QueueNode
//{
//	QueueDataType data;
//	struct QueueNode* next;
//}QueueNode;
//
//typedef struct Queue
//{
//	int size;
//	QueueNode* head;
//	QueueNode* tail;
//}Queue;
//
//void QueueInit(Queue* pq);//队列初始化
//
//void QueueDestroy(Queue* pq);//队列销毁
//
//void QueuePush(Queue* pq, QueueDataType x);//队列入值
//
//void QueuePop(Queue* pq);//队列删值
//
//QueueDataType QueueFront(Queue* pq);//队列首值
//
//QueueDataType QueueBack(Queue* pq);//队列尾值
//
//bool QueueEmpty(Queue* pq);//队列判空
//
//int QueueSize(Queue* pq);//队列大小
//
//void QueueInit(Queue* pq)//队列初始化
//{
//	assert(pq);
//	pq->head = pq->tail = NULL;
//	pq->size = 0;
//}
//
//void QueueDestroy(Queue* pq)//队列销毁
//{
//	assert(pq);
//	QueueNode* cur = pq->head;
//	while (cur)
//	{
//		QueueNode* next = cur->next;
//		free(cur);
//		cur = cur->next;
//	}
//	pq->head = pq->tail = NULL;
//}
//
//void QueuePush(Queue* pq, QueueDataType x)//队列入值
//{
//	assert(pq);
//	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
//	if (newnode == NULL)
//	{
//		perror("malloc");
//		exit(-1);
//	}
//	newnode->data = x;
//	newnode->next = NULL;
//	if (pq->head == NULL)
//	{
//		pq->head = pq->tail = newnode;
//	}
//	else
//	{
//		pq->tail->next = newnode;
//		pq->tail = newnode;
//	}
//	pq->size++;
//}
//
//void QueuePop(Queue* pq)//队列删值
//{
//	assert(pq);
//	assert(!QueueEmpty(pq));
//	if (pq->head->next == NULL)
//	{
//		free(pq->head);
//		pq->head = pq->tail = NULL;
//	}
//	else
//	{
//		QueueNode* next = pq->head->next;
//		free(pq->head);
//		pq->head = next;
//	}
//	pq->size--;
//}
//
//
//QueueDataType QueueFront(Queue* pq)//队列首值
//{
//	assert(pq);
//	assert(!QueueEmpty(pq));
//	return pq->head->data;
//}
//
//QueueDataType QueueBack(Queue* pq)//队列尾值
//{
//	assert(pq);
//	assert(!QueueEmpty(pq));
//	return pq->tail->data;
//}
//
//bool QueueEmpty(Queue* pq)//队列判空
//{
//	return pq->head == NULL;
//}
//
//int QueueSize(Queue* pq)//队列大小
//{
//	return pq->size;
//}
//
//typedef struct {
//	Queue q1;
//	Queue q2;
//} MyStack;
//
//
//MyStack* myStackCreate() {
//	MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
//	QueueInit(&obj->q1);
//	QueueInit(&obj->q2);
//
//	return obj;
//}
//
//void myStackPush(MyStack* obj, int x) {
//	if (!QueueEmpty(&obj->q1))
//	{
//		QueuePush(&obj->q1, x);
//	}
//	else
//	{
//		QueuePush(&obj->q2, x);
//	}
//}
//
//int myStackPop(MyStack* obj) {
//	Queue* EmptyQueue = &obj->q1;
//	Queue* NonEmptyQueue = &obj->q2;
//	if (!QueueEmpty(&obj->q1))
//	{
//		NonEmptyQueue = &obj->q1;
//		EmptyQueue = &obj->q2;
//	}
//	while (QueueSize(NonEmptyQueue) > 1)
//	{
//		QueuePush(EmptyQueue, QueueFront(NonEmptyQueue));
//		QueuePop(NonEmptyQueue);
//	}
//	int ret = QueueFront(NonEmptyQueue);
//	QueuePop(NonEmptyQueue);
//	return ret;
//}
//
//int myStackTop(MyStack* obj) {
//	if (!QueueEmpty(&obj->q1))
//	{
//		return QueueBack(&obj->q1);
//	}
//	else
//	{
//		return QueueBack(&obj->q2);
//	}
//}
//
//bool myStackEmpty(MyStack* obj) {
//	return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
//}
//
//void myStackFree(MyStack* obj) {
//	QueueDestroy(&obj->q1);
//	QueueDestroy(&obj->q2);
//	free(obj);
//}
//
//int main()
//{
//	MyStack* obj = myStackCreate();
//	myStackPush(obj, 1);
//	myStackPush(obj, 2);
//	printf("%d ", myStackTop(obj));
//	printf("%d ", myStackPop(obj));
//	if (!myStackEmpty(obj))
//	{
//		printf("yes");
//	}
//	myStackFree(&obj);
//	return 0;
//}

